package UI;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class PanelFormularioGenerico extends JPanel {

    public PanelFormularioGenerico() {
        super();
    }

    public PanelFormularioGenerico(String tituloCriterio, String tituloValor, String[] listaNombreCriterios, String[] listaValoresDeCampos, int[] listaTiposDeCampo) {
        super();
        this.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        JLabel labelTituloCriterio = new JLabel(tituloCriterio);
        c.fill = 1;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        c.gridheight = 1;
        this.add(labelTituloCriterio, c);

        JLabel labelTituloValor = new JLabel(tituloValor);
        c.gridx = 1;
        c.gridy = 0;
        this.add(labelTituloValor, c);

        JLabel labelAAgregar;

        for (int i = 0; i < listaNombreCriterios.length; i++) {
            final int ii = i;
            c.gridy = i + 1;

            labelAAgregar = new JLabel(listaNombreCriterios[i]);
            c.gridx = 0;
            this.add(labelAAgregar, c);

            c.gridx = 1;
            final JTextField campoAAgregar = new JTextField(listaValoresDeCampos[i]);
            campoAAgregar.setColumns(10);
            this.add(campoAAgregar, c);

            campoAAgregar.getDocument().addDocumentListener(new DocumentListener() {

                @Override
                public void changedUpdate(DocumentEvent e) {
                    revisarCampo();
                }

                @Override
                public void removeUpdate(DocumentEvent e) {
                    listaValoresDeCampos[ii] = campoAAgregar.getText();
                }

                @Override
                public void insertUpdate(DocumentEvent e) {
                    revisarCampo();
                }

                private void revisarCampo() {

                    switch (listaTiposDeCampo[ii]) {
                        case 0:
                            listaValoresDeCampos[ii] = campoAAgregar.getText();
                            break;
                        case 1://Tiene que ser long positivo
                            try {
                                Long.parseLong(campoAAgregar.getText());
                                listaValoresDeCampos[ii] = campoAAgregar.getText();
                            } catch (Exception e) {
                                JOptionPane.showMessageDialog(null, "El campo " + listaNombreCriterios[ii].toLowerCase() + " solo admite valores enteros positivos", "Error", JOptionPane.ERROR_MESSAGE);
                                resetearCampo();
                                try {
                                    Thread.sleep(200);
                                } catch (InterruptedException ex) {

                                }

                            }
                            break;
                        case 2://Tiene que ser int positivo
                            try {
                                Integer.parseInt(campoAAgregar.getText());
                                listaValoresDeCampos[ii] = campoAAgregar.getText();
                            } catch (Exception e) {
                                JOptionPane.showMessageDialog(null, "El campo " + listaNombreCriterios[ii].toLowerCase() + " solo admite valores enteros positivos", "Error", JOptionPane.ERROR_MESSAGE);
                                resetearCampo();
                                try {
                                    Thread.sleep(200);
                                } catch (InterruptedException ex) {

                                }
                            }
                            break;
                        case 3://Tiene que ser float positivo
                            try {
                                Float.parseFloat(campoAAgregar.getText());
                                listaValoresDeCampos[ii] = campoAAgregar.getText();
                            } catch (Exception e) {
                                JOptionPane.showMessageDialog(null, "El campo " + listaNombreCriterios[ii].toLowerCase() + " solo admite valores reales positivos", "Error", JOptionPane.ERROR_MESSAGE);
                                resetearCampo();
                                try {
                                    Thread.sleep(200);
                                } catch (InterruptedException ex) {

                                }
                            }
                            break;
                        case 4://Tiene que ser int entre 1 y 6 (El estrato...)
                            try {
                                int estrato = Integer.parseInt(campoAAgregar.getText());
                                listaValoresDeCampos[ii] = campoAAgregar.getText();
                                if (estrato < 1 || estrato > 6) {
                                    throw new Exception();
                                }
                            } catch (Exception e) {
                                JOptionPane.showMessageDialog(null, "El campo " + listaNombreCriterios[ii].toLowerCase() + " solo admite valores enteros entre 1 y 6", "Error", JOptionPane.ERROR_MESSAGE);
                                resetearCampo();
                                try {
                                    Thread.sleep(200);
                                } catch (InterruptedException ex) {

                                }
                            }
                            break;
                        default:
                            JOptionPane.showMessageDialog(null, "Error mortal. Codigo de tipo de textfield no valido en " + listaNombreCriterios[ii].toLowerCase(), "Error", JOptionPane.ERROR_MESSAGE);
                            break;
                    }
                }

                private void resetearCampo() {
                    Runnable resetear = new Runnable() {
                        @Override
                        public void run() {
                            campoAAgregar.setText("");
                        }
                    };
                    try {
                        SwingUtilities.invokeLater(resetear);
                    } catch (Exception e) {

                    }
                }
            });

            if (listaTiposDeCampo[i] == 5) {
                campoAAgregar.setEditable(false);
                campoAAgregar.setEnabled(false);
            }

        }

    }

}
